package main

import "fmt"

func main() {
	ch1 := make(chan int)
	ch2 := make(chan int)

	// 开启goroutine将0~99的数发送到ch1中
	go func() {
		for i := 0; i < 100; i++ {
			ch1 <- i
		}
		close(ch1) //发送完毕之后关闭ch1
	}()

	// 开启goroutine从ch1中接收值，并将该值的平方发送到ch2中
	go func() {
		for {
			i, ok := <-ch1 // 通道关闭后再取值ok=false
			if !ok {
				break
			}
			ch2 <- i * i
		}
		close(ch2)
	}()

	// 在主goroutine中从ch2中接收值打印
	for i := range ch2 { // ch2 通道关闭后会退出for range循环
		fmt.Println(i)
	}
}

/**
从上面我们可看出有两种方式在接受值的时候判断通道是否被关闭：
1. i, ok := <-ch1
2. for i := range ch2
    我们通常使用的是for range的方式。
*/
